package tools;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.Objects;

/**
 * Created by yangxianming on 2017/4/17.
 * jsonPath描述：result/token
 * 可以获取json列表值，并返回列表。同时也可以获取单个json值
 * 但是获取["aa","bb"]这样得数组时会又问题
 */
public class JsonPath {
    public JSONArray parse(Object jsonObjOrArr, String jsonPath){

        JSONArray resultList = new JSONArray();
        String stringJson = jsonObjOrArr.toString();
        String firstNode = "";
        String afterNode = "";
        boolean isJsonObject = true;

        //判断是不是最后一个节点
        if (jsonPath.contains("/")){
            firstNode = jsonPath.substring(0, jsonPath.indexOf("/"));
            // afterNode="" 说明是最后一个节点
            afterNode = jsonPath.substring(jsonPath.indexOf("/") + 1, jsonPath.length());
        }else {
            firstNode = jsonPath;
        }

        //判断过来得json是jsonObject还是jsonArray
        if (Objects.equals(stringJson.substring(0, 1), "["))
            isJsonObject = false;

        //判断要处理得对象值是否是数组


        //区分处理json对象和数组
        if (isJsonObject){
            //处理jsonObject
            Object o;
            if (firstNode.contains("[")){
                //有下标，取下标再取值
                int index = Integer.valueOf(firstNode.substring(firstNode.indexOf("[") + 1, firstNode.indexOf("]")));
                firstNode = firstNode.substring(0, firstNode.indexOf("["));
                JSONObject jsonObject = (JSONObject)jsonObjOrArr;
                o = jsonObject.getJSONArray(firstNode).get(index);
            }else {
                //没有下标直接取值
                JSONObject jsonObject = (JSONObject)jsonObjOrArr;
                o = jsonObject.get(firstNode);
            }

            //判断是否还有后续节点
            if (!Objects.equals(afterNode, "")){
                resultList = parse(o, afterNode);
            }else {
                resultList.add(o);
            }
        }else {
            //处理jsonArray,没有下标得节点说明要返回全部数组下得节点数据
            JSONArray jsonArray = (JSONArray)jsonObjOrArr;
            for (Object o: jsonArray){
//                Object o =
                if (!Objects.equals(afterNode, "")){
                    //说明还有后续节点
                    resultList = parse(o, afterNode);
                }else {
                    resultList.add(((JSONObject)o).get(firstNode));
                }
            }
        }
        return resultList;
    }
}
